今天來介紹一個在 SwiftUI 裡很重要的東西,Property Wrapper,也就是屬性包裝器。
那介紹之前先來了解一下 Property Wrapper 是什麼,Property Wrapper 通常是用來打包 ”計算屬性“ 或是 “屬性觀察” 的功能,方便重複使用。
而一個帶有 Property Wrapper 的屬性會產生三個屬性:
1. 屬性:指儲存的值
2. _屬性:指 Property Wrapper 本身
3. $屬性:指投射屬性,可設定成任何屬性
而其中第三種帶 $ 符號版本的不一定有,Property Wrapper 內必須要有設定 ProjectedValue 才能使用。
那先來介紹幾種常用的 Property Wrapper。
首先要介紹的是這個:@State。
正常情況下,我們要對一個值進行存儲及更新,要去設定 class,設定畫面更新,是不是感覺很麻煩。
於是 SwiftUI 提供了一個 Property Wrapper 將這些事情包裝起來。當我們要對一個 Value type 的數值變化做管理時,在數值前面加上 @State,這樣一來,當這個數值有變化時,@State 會去通知這個畫面要去做更新。
具體效果如下。
只要在 testString 前加上 @State,每當我按下 Button 時,@State 就會通知畫面要去更新 Text 的值。
還有,在使用 @State 時要注意,要確保 @State 只屬於建立他的那個 View,讓他的生命週期跟著畫面,所以在使用的時候,可以設定為 private,來避免外部啟用,或是避免使用帶有 _ 符號的屬性。
而 @State 本身帶有 $ 符號的投射屬性是 Binding,這個就會直接連接到 @State 裡面打包的值,而這個 Binding 其實也是一個 Property Wrapper,關於他的部分之後會再介紹。
以及,如果只是要對畫面做更新,那 @State 放在哪一層都是可以的,但是如果是要使用同一筆資料,那需要將 @State 寫在最上層之後再用 @Binding 去做串連。
那今天就先介紹到這邊,明天來介紹剛剛提到的 @Binding 和另一個 Property Wrapper。